package com.ai.test;

import java.io.*;
import java.util.*;

import jcifs.smb.*;

public class DownloadAllImagesFromSharedFolder {

//    public static String user = "Administrator";
//    public static String pass = "Admin@123";

    public static String user = "Dumbledore";
    public static String pass = "963.963.";

    public static void main(String[] args) {
        String sharedFolderPath = "smb://192.168.1.39/Users/zikang/Desktop/downvideo-1580/static/img/"; // 共享文件夹路径
        String localFolderPath = "/javaDemoImage"; // 本地文件夹路径
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null); // 设置认证信息
        List<String> imageExtensions = Arrays.asList(".jpg", ".jpeg", ".png", ".bmp"); // 支持的图片文件扩展名
        List<String> imageUrls = new ArrayList<>(); // 存储所有图片文件的 URL


        try {
            SmbFile sharedFolder = new SmbFile(sharedFolderPath, auth); // 创建共享文件夹的 SmbFile 对象
            if (sharedFolder.exists() && sharedFolder.isDirectory()) { // 检查共享文件夹是否存在且为目录
                collectImageUrls(sharedFolder, imageExtensions, imageUrls); // 遍历共享文件夹并收集所有图片文件的 URL
                System.out.println(imageUrls);
                downloadImages(imageUrls, localFolderPath, auth); // 下载所有图片文件到本地文件夹
                System.out.println("所有图片文件下载完成！");
            } else {
                System.out.println("指定的共享文件夹不存在或不是目录！");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 遍历共享文件夹并收集所有图片文件的 URL
    private static void collectImageUrls(SmbFile sharedFolder, List<String> imageExtensions, List<String> imageUrls) throws Exception {
        SmbFile[] files = sharedFolder.listFiles(); // 获取共享文件夹中的所有文件
        for (SmbFile file : files) {
            if (file.isDirectory()) { // 如果是子目录，则递归遍历该目录
                collectImageUrls(file, imageExtensions, imageUrls);
            } else if (isImageFile(file.getName(), imageExtensions)) { // 如果是图片文件，则将其 URL 添加到列表中
                imageUrls.add(file.getURL().toString());
            }
        }
    }

    // 判断给定文件名是否是图片文件
    private static boolean isImageFile(String fileName, List<String> imageExtensions) {
        for (String ext : imageExtensions) {
            if (fileName.toLowerCase().endsWith(ext)) {
                return true;
            }
        }
        return false;
    }

    // 下载所有图片文件到本地文件夹
    private static void downloadImages(List<String> imageUrls, String localFolderPath, NtlmPasswordAuthentication auth) throws Exception {
        SmbFile localFolder = new SmbFile(localFolderPath + "/", auth); // 创建本地文件夹的 SmbFile 对象
        if (!localFolder.exists()) { // 如果本地文件夹不存在，则创建它
            localFolder.mkdirs();
        }
        for (String imageUrl : imageUrls) { // 遍历所有图片文件的 URL 并下载文件到本地文件夹
            SmbFile sharedFile = new SmbFile(imageUrl, auth);
            if (sharedFile.exists()) { // 检查文件是否存在
                String fileName = sharedFile.getName(); // 获取文件名
                String localFilePath = localFolderPath + File.separator + fileName; // 构建本地文件路径
                System.out.println("fileName = " + fileName + ";localFilePath = " + localFilePath);
                SmbFile localFile = new SmbFile("file://" + localFilePath, auth); // 创建本地文件的 SmbFile 对象
                try (InputStream is = sharedFile.getInputStream(); OutputStream os = localFile.getOutputStream()) {
                    byte[] buffer = new byte[4096];
                    int length = 0;
                    while ((length = is.read(buffer)) > 0) { // 从共享文件中读取数据并写入本地文件
                        os.write(buffer, 0, length);
                    }
                    System.out.println(fileName + " 下载完成！");
                }
            } else {
                System.out.println(imageUrl + " 不存在或无法访问！");
            }
        }
    }
}